package ar.edu.phm.tpdos.validadorMaxi;

import java.util.ArrayList;


public aspect ValidadorAspectMaxi {
	private ArrayList<ObjetoValidableMaxi> objetosValidables = new ArrayList<ObjetoValidableMaxi>();
	
	pointcut asignacionMonitoreada (Object target, Object newValue) :
		set(* ar.edu.phm.tpdos.dominio..*)
		 && target(target) && args(newValue);
	
	before (Object target, Object newValue): asignacionMonitoreada(target, newValue)  {
		String nombreVariable = thisJoinPoint.getSignature().getName();
		notificarValidadores(target, nombreVariable, newValue);
	}

	private void notificarValidadores(Object target, String nombreVariable, Object newValue) {
		for (int i = 0; i < objetosValidables.size(); i++) {
			objetosValidables.get(i).validar(target, nombreVariable, newValue);
		}
	}
	
	public void agregarValidador(Object object, String nombre, ValidadorMaxi<?> validador){
		ObjetoValidableMaxi o = new ObjetoValidableMaxi();
		o.target = object;
		o.nombreVariable = nombre;
		o.validador = validador;
		objetosValidables.add(o);		
	}
	
	public void eliminarValidador (ValidadorMaxi<?> validador){
		objetosValidables.remove(validador);
	}
}
